#include <string>
#include <stdio.h>
#include <iostream>
#include <sys/stat.h>
#include "ValidationUtils.h"
#include "Zuma.h"

using namespace std;

string getConfigFileName(int, char**);
int getQueryType();
string getQuery(int);
void showInfo(Zuma*, int, string);
			
int main(int argc, char* argv[])
{
	try{
		system("CLS");

		// buscamos el nombre del archivo como argumento del programa o se lo pedimos al usuario
		string configFileName = getConfigFileName(argc, argv);

		// incializamos el juego
		Zuma* zuma = new Zuma();
		zuma->initialize(configFileName);

		// le preguntamos al usuario que quiere saber
		string query;
		int queryType = getQueryType();
		while(queryType != 0)
		{
			query = getQuery(queryType);
			while(query.length() > 0)
			{
				showInfo(zuma, queryType, query);
				query = getQuery(queryType);
			}

			queryType = getQueryType();
		}

		delete (zuma);
	}catch(InitializationException e){
		cout << "\nSe produjo un error durante la inicializacion del juego.\nVerifique el log para mas detalles." <<endl;
	}catch(...) {
		cout << "Se produjo un error durante el procesamiento." << endl;
	}
	cout << "\n\n";
	system("PAUSE");
	return 0;
}

string getConfigFileName(int argc, char* argv[])
{
	string configFileName;
	if(argc >= 2)
	{
		configFileName = string(argv[1]);
	}

	bool isValidFileName = false;
	do
	{
		// vemos si es un nombre de archivo valido
		isValidFileName = ValidationUtils::fileExists(configFileName);
		if(!isValidFileName)
		{
			if(configFileName.length() > 0)
			{
				cout << "No es posible abrir el archivo: " << configFileName << "\n";
			}
			cout << "Ingrese un nombre de archivo valido de configuracion para Zuma: ";
			getline(cin, configFileName);
		}
	} while(!isValidFileName);

	return configFileName;
}

int getQueryType()
{
	string type;
	cout << "Ingrese 1 para TAGs o 2 para IDs: ";
	getline(cin, type);
	int queryType = atoi(type.c_str());
	switch(queryType)
	{
		case 1:
		case 2:
			break;
		default:
			queryType = 0;
	}
	return queryType;
}

string getQuery(int type)
{
	switch(type)
	{
		case 1:
			cout << "Ingrese el TAG que desea consultar: ";
			break;
		case 2:
			cout << "Ingrese el ID que desea consultar: ";
			break;
	}
	string query;
	getline(cin, query);
	return query;
}

void showInfo(Zuma* zuma, int type, string query)
{
	switch(type)
	{
		case 1:
			try
			{
				zuma->showElementByTag(query);
			}
			catch(NoSuchXmlElementException e)
			{
				cout << "No se encontro un elemento con el TAG especificado\n";
			}
			break;
		case 2:
			try
			{
				zuma->showElementById(query);
			}
			catch(NoSuchXmlElementException e)
			{
				cout << "No se encontro un elemento con el ID especificado\n";
			}
			break;
	}
}
